Tuberculosis, un desafío en las poblaciones indígenas y afroperuanas
Análisis de datos del Ministerio de Salud (MINSA)
Author
Subdirección de Medicina Tradicional, Interculturalidad e Investigación Social (SUMEC-CENSI)
Published
December 17, 2025
La tuberculosis es una enfermedad infecciosa y aunque es prevenible y tratable sigue afectando a miles de personas. Es producida por el Mycobacterium tuberculosis que afecta sobre todo a los pulmones, pero también a otros órganos como la piel, huesos, la columna vertebral, entre otros.
Se analizo la data del HIS del Ministerio de Salud desde el 2019 hasta el 2022 y se puede observar que los registros del diagnóstico de tuberculosis se han reducido por el impacto de la pandemia por el Covid -19.
Según el CIE 10, Clasificación Estadística Internacional de Enfermedades y Problemas Relacionados con la Salud, elaborado por la Organización Mundial de la Salud, en tuberculosis considera estas categorías:
Tuberculosis respiratoria, confirmada bacteriológica e histológicamente
Tuberculosis respiratoria, no confirmada bacteriológica o histológicamente
Tuberculosis del sistema nervioso
Tuberculosis de otros órganos
Tuberculosis Miliar
Tuberculosis en poblaciones indígenas, afroperuanas y mestizas 2019-2025
Desde el 2019 al 2022 el porcentaje alcanzado fue por encima del 98% del total de casos. En el 2023, regsitró 97.5%. En las poblaciones amazónicas, el 2023 casi duplicó las atenciones del año anterior., de 1.1% pasó a 2%. En las poblaciones andinas y afroperuana presentan un menor registro de casos, especialmente esta última.
Categorías de Tuberculosis en poblaciones indígenas, afroperuanas y mestizas 2019-2025 (según CIE 10)
En los pueblos de la Amazonía, la categoría de tuberculosis con mayores casos, desde el 2020 al 2022, fue la tuberculosis respiratoria, confirmada bacteriológica o histológicamente y el 2023, fue la tuberculosis respiratoria, no confirmada bacteriológica o histológicamente..En las poblaciones andinas, el tipo, la Tuberculosis respiratoria, confirmada bacteriológica e histológicamente tuvo mayores registros el desde el 2021 al 2023.
Tuberculosis en poblaciones indígenas, afroperuanas y mestizas por sexo 2019-2025
El mayor registro de casos en la población afroperuana se ha dado en las mujeres. Se observa especialmente en el total de los resultados, el 2021, casi el 100% son mujeres.
En las poblaciones amazónicas, desde el 2019 al 2021, los hombres son los más afectados por la tuberculosis. El 2022 y, especialmente, el 2023, fueron las mujeres con el 58%.
En los pueblos andinos, se observa una leve diferencia, en los casos de mujeres y hombre, el 2019 y 2020, hubo más registros de mujeres. Desde el 2021 al 2023 se registraron más casos en hombres.
library(rio)data_tb_sexo<-import("data-Tt9rl.csv")library(tidyverse)library(plotly)# 1. DATOS ORIGINALESdata_tb_sexo <-tribble(~X.1, ~Año, ~M, ~F,"Población afroperuana", 2019, 6, 12,"Población afroperuana", 2020, 9, 17,"Población afroperuana", 2021, 1, 31,"Población afroperuana", 2022, 2, 12,"Población afroperuana", 2023, 1, 4,"Población afroperuana", 2024, 4, 1,"Población afroperuana", 2025, 1, 3,"Poblaciones amazónicas", 2019, 280, 265,"Poblaciones amazónicas", 2020, 256, 183,"Poblaciones amazónicas", 2021, 261, 247,"Poblaciones amazónicas", 2022, 416, 491,"Poblaciones amazónicas", 2023, 820, 1114,"Poblaciones amazónicas", 2024, 619, 569,"Poblaciones amazónicas", 2025, 282, 320,"Poblaciones andinas", 2019, 108, 119,"Poblaciones andinas", 2020, 84, 104,"Poblaciones andinas", 2021, 113, 109,"Poblaciones andinas", 2022, 204, 151,"Poblaciones andinas", 2023, 250, 190,"Poblaciones andinas", 2024, 261, 164,"Poblaciones andinas", 2025, 191, 127)# 2. PROCESAMIENTO Y CÁLCULO DE POSICIONESplot_data <- data_tb_sexo %>%rename(Poblacion = X.1) %>%pivot_longer(cols =c("M", "F"), names_to ="Sexo", values_to ="Casos") %>%group_by(Poblacion) %>%mutate(# Calculamos el máximo por grupo para dar un margen proporcionalMax_Grupo =max(Casos),Offset = Max_Grupo *0.08, # 15% del ancho máximo como espacio para el número# Posición de la barra (Hombres negativo, Mujeres positivo)Casos_Plot =ifelse(Sexo =="M", -Casos, Casos),# SOLUCIÓN DEFINITIVA PARA TEXTO: Calculamos la coordenada X exacta del texto# Si es M, restamos el offset (más a la izquierda). Si es F, sumamos (más a la derecha).Texto_X =ifelse(Sexo =="M", Casos_Plot - Offset, Casos_Plot + Offset), Año =factor(Año, levels =rev(2019:2025)),Sexo =factor(Sexo, levels =c("M", "F")) ) %>%ungroup()# 3. LÍMITES PARA CENTRAR EL CERO# Aumentamos el multiplicador a 1.6 (60% extra) para asegurar que el texto quepadummy_limits <- plot_data %>%group_by(Poblacion) %>%summarise(limit =max(abs(Casos)) *1.6) %>%crossing(direction =c(-1, 1)) %>%mutate(x = limit * direction)# 4. COLOREScolores_sexo <-c("M"="#d5a6e0", "F"="#ffdf80")# 5. GRÁFICOg_piramide <-ggplot(plot_data, aes(y = Año, fill = Sexo)) +# Barras: Usamos Casos_Plot para dibujargeom_col(aes(x = Casos_Plot, text =paste("Año:", Año, "<br>Sexo:", Sexo, "<br>Casos:", Casos)), width =0.8) +# Capa invisible para expandir ejes simétricamentegeom_blank(data = dummy_limits, aes(x = x, y =Inf, fill =NULL)) +# Etiquetas: Usamos Texto_X (la posición calculada manualmente fuera de la barra)geom_text(aes(x = Texto_X, label = Casos), size =3, color ="#333333", fontface ="bold",hjust =0.5) +# Centrado en su nueva posición calculadafacet_wrap(~Poblacion, ncol =1, scales ="free_x") +scale_fill_manual(values = colores_sexo) +scale_x_continuous(labels = abs) +labs(title ="Tuberculosis en población afroperuana, amazónica y andina por sexo",subtitle ="2019-2025",x ="Número de Casos",y ="" ) +theme_minimal() +theme(plot.title =element_text(hjust =0.5, face ="bold", size =14), # Título centradostrip.text =element_text(face ="bold", size =12, hjust =0.5), # Subtítulos centradosstrip.background =element_blank(),panel.grid.major.y =element_blank(),legend.position ="bottom", # Se gestiona en plotlyaxis.text.y =element_text(face ="bold") )# 6. INTERACTIVIDADggplotly(g_piramide, tooltip ="text", height =800) %>%layout(legend =list(orientation ="h",xanchor ="center",x =0.5,y =-0.05, # Leyenda abajotitle =list(text ="") ),margin =list(t =80, l =80, b =80) )
Code
make_download_table(data_tb_sexo, "data_tb_sexo")
Tuberculosis en poblaciones indígenas, afroperuanas y mestizas por curso de vida 2019-2025
En las poblaciones andinas y amazónicas los mayores registros se dan en los adultos de 30 a 59 años, en todo el periodo analizado. Desde el 2019 al 2022, en las poblaciones amazónicas es seguido por los jóvenes; el 2023 hubo más registros de adultos mayores. Asimismo, desde el 2022, se observa se observa un mayor incremento en adolescentes. En cambio, en las poblaciones andinas, los adultos de 30 a 59 años, es seguido por los adultos mayores desde el 2019 al 2020 y desde el 2022 al 2023.
Desde el 2019 al 2022, Ayacucho y Puno son las regiones con mayores registros en las poblaciones andinas. El 2023 son Ayacucho y Cusco, este último departamento triplicó en el número de sus registros.
Code
#| warning: falselibrary(tidyverse)library(plotly)library(viridis)# 1. DATOS (Extraídos del Flourish de TB Población Andina)data_tb_andina <-tribble(~Departamento, ~`2019`, ~`2020`, ~`2021`, ~`2022`, ~`2023`, ~`2024`, ~`2025`,"AMAZONAS", 1, 0, 0, 0, 1, 0, 1,"ANCASH", 5, 10, 11, 19, 20, 41, 49,"APURIMAC", 0, 0, 0, 0, 6, 6, 6,"AREQUIPA", 1, 0, 0, 4, 3, 8, 3,"AYACUCHO", 102, 109, 93, 121, 90, 72, 27,"CAJAMARCA", 0, 0, 0, 0, 2, 2, 1,"CALLAO", 1, 0, 1, 2, 4, 3, 1,"CUSCO", 24, 8, 5, 28, 101, 80, 59,"HUANCAVELICA", 2, 5, 11, 6, 23, 78, 46,"HUANUCO", 10, 8, 0, 4, 2, 0, 2,"ICA", 1, 5, 4, 6, 5, 2, 3,"JUNIN", 0, 1, 1, 0, 2, 5, 1,"LA LIBERTAD", 0, 1, 0, 0, 1, 0, 0,"LAMBAYEQUE", 0, 0, 1, 0, 1, 4, 9,"LIMA", 35, 10, 36, 89, 98, 77, 63,"LORETO", 3, 1, 2, 4, 1, 2, 1,"MADRE DE DIOS", 0, 1, 1, 1, 4, 9, 1,"MOQUEGUA", 0, 0, 1, 0, 0, 1, 0,"PASCO", 0, 0, 0, 0, 7, 0, 0,"PIURA", 2, 0, 0, 0, 0, 0, 0,"PUNO", 36, 26, 50, 67, 43, 19, 32,"SAN MARTIN", 0, 1, 0, 0, 10, 4, 0,"TACNA", 4, 0, 1, 3, 7, 5, 5,"TUMBES", 0, 1, 4, 0, 4, 0, 0,"UCAYALI", 0, 1, 0, 1, 5, 7, 8)# 2. PROCESAMIENTO (Con corrección de ranking)plot_data <- data_tb_andina %>%pivot_longer(cols =`2019`:`2025`, names_to ="Año_Texto", values_to ="Casos") %>%mutate(`Año`=as.numeric(Año_Texto)) %>%complete(Departamento, `Año`, fill =list(Casos =0)) %>%# Ordenar alfabéticamente (Invertido para que 'Amazonas' salga arriba en el gráfico)mutate(Departamento =fct_rev(factor(Departamento)),Tooltip_Text =paste0("<b>", Departamento, "</b><br>","Casos: ", Casos) ) %>%# Ordenar el dataframe para que la animación sea secuencialarrange(`Año`, Departamento)# 3. COLOREScolores_region <-c("UCAYALI"="#730000", "LORETO"="#c11f1f", "AMAZONAS"="#ff8800","JUNIN"="#ffc502", "PASCO"="#88e99a", "CUSCO"="#1aa7ee","LIMA"="#9b96e4", "SAN MARTIN"="#dc9bee", "MADRE DE DIOS"="#007d8e","HUANUCO"="#29dae4")# 3. GRÁFICO (Todas las regiones, posición fija)g_animado <-ggplot(plot_data, aes(x = Casos, y = Departamento)) +# Barras# Usamos una escala de colores viridis porque son muchas categorías (24)geom_col(aes(fill = Departamento, frame =`Año`, text = Tooltip_Text), width =0.7, position="identity") +# Usamos viridis (turbo o plasma) para diferenciar 24 coloresscale_fill_viridis_d(option ="turbo", guide ="none") +# Expansión del eje X para que quepan los números grandes (como el 1067 de Ucayali)scale_x_continuous(expand =expansion(mult =c(0, 0.2))) +labs(title ="Evolución de Tuberculosis en Poblaciones Andinas (Por Departamento)",x ="Número de Casos",y ="" ) +theme_minimal() +theme(plot.title =element_text(hjust =0.5, face ="bold", size =14),panel.grid.major.y =element_blank(), # Limpieza visualaxis.text.y =element_text(size =9), legend.position ="none"# Texto del eje Y legible )# 4. INTERACTIVIDAD# Aumentamos el 'height' a 900px porque 24 barras necesitan espacio verticalggplotly(g_animado, tooltip ="text", height =900) %>%layout(showlegend =FALSE,margin =list(l =120, r =50), # Margen izquierdo para nombres largos como "Madre de Dios"animation =list(frame =list(duration =1000, redraw =TRUE),transition =list(duration =500, easing ="linear") ) )